www.gusucode.com > VC++ 编写软件自动升级服务源代码 > VC++ 编写软件自动升级服务源代码/gusucode/updater_src0.8.1.6/ModeHidden.cpp
/******************************************************************** created: 2005/03/02 created: 2:3:2005 15:13 filename: ModeHidden.cpp file path: Updater file base: ModeHidden file ext: cpp author: Geert van Horrik purpose: *********************************************************************/ //********************************************************************* // INCLUDES //********************************************************************* #include "stdafx.h" #include "Updater.h" #include "ModeHidden.h" //********************************************************************* // MESSAGE MAP //********************************************************************* BEGIN_MESSAGE_MAP(CModeHidden, CWnd) ON_MESSAGE(WMU_TASK_START, OnTaskStart) ON_MESSAGE(WMU_TASK_COMPLETE, OnTaskComplete) ON_MESSAGE(WMU_ERROR, OnError) ON_MESSAGE(WMU_WARNING, OnWarning) ON_MESSAGE(WMU_QUESTION, OnQuestion) END_MESSAGE_MAP() //********************************************************************* // CONSTRUCTOR & DESTUCTOR //********************************************************************* IMPLEMENT_DYNAMIC(CModeHidden, CDialog) //===================================================================== CModeHidden::CModeHidden(CWinThread * pUpdateProcess, int iCurrentTask) : CDialog(CModeHidden::IDD, (CWnd *)pUpdateProcess) { // Set values m_pUpdateProcess = pUpdateProcess; m_iCurrentTask = iCurrentTask; } //===================================================================== CModeHidden::~CModeHidden() { } //********************************************************************* // PUBLIC FUNCTIONS //********************************************************************* //********************************************************************* // PRIVATE FUNCTIONS //********************************************************************* BOOL CModeHidden::OnInitDialog() { // Call original function CDialog::OnInitDialog(); // Init singleton classes m_pFunctions = CFunctions::Instance(); m_pLanguage = CLanguage::Instance(); m_pSettings = CSettings::Instance(); m_pUpdateInfo = CUpdateInfo::Instance(); m_pPath = CPath::Instance(); // We are not initialized yet m_bInit = false; m_bFinished = false; // Set right action PostMessage(WMU_TASK_START, m_iCurrentTask); // Return TRUE unless you want to set focus to a control return TRUE; } //===================================================================== LRESULT CModeHidden::OnTaskStart(WPARAM wParam, LPARAM lParam) { // Declare variables CString sTemp; // Get data int iTask = wParam; m_iCurrentTask = iTask; // Check what task is started switch (iTask) { case TASK_HTMLMESSAGE: // Just go to next step, user is not interested in html message m_pUpdateProcess->PostThreadMessage(WMU_TASK_COMPLETE, iTask, 0); //m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_STARTNEXTTASK, 0); break; case TASK_LICENSE: // Send task complete message m_pUpdateProcess->PostThreadMessage(WMU_TASK_COMPLETE, iTask, 0); break; case TASK_SELECTUPDATE: // Send task complete message m_pUpdateProcess->PostThreadMessage(WMU_TASK_COMPLETE, iTask, 0); break; } return S_OK; } //===================================================================== LRESULT CModeHidden::OnTaskComplete(WPARAM wParam, LPARAM lParam) { // Declare variables CString sTemp; // Get data int iTask = wParam; // Take it easy, we are hidden anyway, this is needed otherwhise the threads // can't make it, Updater will be too fast! Sleep(250); // Check what task is completed switch (iTask) { case TASK_HTMLMESSAGE: // Do not send any message return S_OK; case TASK_LICENSE: // Do not send any message return S_OK; case TASK_PROTECTION: // Do not send any message return S_OK; case TASK_SELECTUPDATE: // Do not send any message return S_OK; case TASK_DOWNLOAD: // Ok, calm down, we have downloaded all files Sleep(1000); break; case TASK_ROLLBACK: // We are finished m_bFinished = true; // We are ready rolling back changes, now finish thread m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_FINISH, 0); break; case TASK_INSTALL: // We are finished m_bFinished = true; // We are ready, now finish thread m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_FINISH, 0); break; } // If it is the last step, let user close application if ((iTask != TASK_INSTALL) && (iTask != TASK_ROLLBACK)) { // Task is complete, don't ask user for confirmation, go to next step m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_STARTNEXTTASK, 0); } return S_OK; } //===================================================================== LRESULT CModeHidden::OnError(WPARAM wParam, LPARAM lParam) { // Get data int iError = wParam; bool bRollback = true; // Check what error has occured switch (iError) { case ERROR_NONEWVERSION: // This is not a real error bRollback = false; break; case ERROR_PROTECTION: // Don't roll back bRollback = false; break; } // Don't show error to user //AfxMessageBox(sError, MB_OK | MB_ICONERROR); // Should we rollback? if (bRollback) { // Start next task, which will be rollback m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_STARTTASK, TASK_ROLLBACK); } else { // We are finished m_bFinished = true; // Finish updating if (m_bFinished) m_pUpdateProcess->PostThreadMessage(WMU_THREADMESSAGE, THREAD_FINISH, 0); } return S_OK; } //===================================================================== LRESULT CModeHidden::OnWarning(WPARAM wParam, LPARAM lParam) { // Don't show warning, just continue m_pUpdateProcess->PostThreadMessage(WMU_WARNING_COMPLETE, 0, 0); return S_OK; } //===================================================================== LRESULT CModeHidden::OnQuestion(WPARAM wParam, LPARAM lParam) { // Declare variables int iQuestion = wParam; int iResult; // Check what type of question switch (iQuestion) { case QUESTION_STOPUPDATING: // Ask user break; case QUESTION_DELETEFILE: // Answer yes iResult = QUESTIONRESULT_YES; break; case QUESTION_CLOSEAPPLICATION: // Answer yes iResult = QUESTIONRESULT_YES; break; case QUESTION_REGISTERFILE: // Answer yes iResult = QUESTIONRESULT_YES; break; } // Return answer m_pUpdateProcess->PostThreadMessage(WMU_QUESTION_ANSWER, iQuestion, iResult); return S_OK; }